home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / compiler / Filename.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  1.4 KB  |  67 lines  |  [TEXT/Moml]

  1. (* filename.mlp *)
  2.  
  3. open CharVector;
  4.  
  5. fun check_suffix name suff =
  6.   let val name_len = size name
  7.       val suff_len = size suff
  8.   in
  9.     name_len >= suff_len andalso
  10.     extract(name, name_len - suff_len, SOME suff_len) = suff
  11.   end;
  12.  
  13. fun chop_suffix name suff =
  14.   extract(name, 0, SOME (size name - size suff))
  15. ;
  16.  
  17. val current_dir_name = ":";
  18.  
  19. fun is_absolute n =
  20.   let val len = size n
  21.       fun h i = 
  22.         if i >= len then false
  23.         else if extract(n, i, SOME 1) = ":" then true
  24.         else h (i+1)
  25.   in h 0 end;
  26.  
  27. fun concat dirname filename =
  28.   let val dirname1 =
  29.         if is_absolute dirname
  30.         then dirname
  31.         else ":" ^ dirname
  32.       val l = size dirname1 - 1
  33.       val dirname2 =
  34.         if l < 0 orelse extract(dirname1, l, SOME 1) = ":"
  35.         then dirname1
  36.         else dirname1 ^ ":"
  37.       val len = size filename
  38.       val filename2 =
  39.         if len > 0 andalso extract(filename, 0, SOME 1) = ":"
  40.         then extract(filename, 1, NONE)
  41.         else filename 
  42.   in dirname2 ^ filename2 end
  43. ;
  44.  
  45. fun colon_pos s =
  46.   let fun pos i =
  47.     if i < 0 then NONE else
  48.     case extract(s, i, SOME 1) of
  49.         ":"  => SOME i
  50.       | _    => pos (i - 1)
  51.   in pos (size s - 1) end
  52. ;
  53.  
  54. fun basename name =
  55.   case colon_pos name of
  56.       SOME p => 
  57.         extract(name, p+1, NONE)
  58.     | NONE   => name
  59. ;
  60.  
  61. fun dirname name =
  62.   if name = ":" then name else
  63.   case colon_pos name of
  64.       SOME p  => extract(name, 0, SOME p)
  65.     | NONE    => ":"
  66. ;
  67.